package it.unisa.unibox.gestioneProdotti;


import it.unisa.unibox.beans.AltroProdotto;
import it.unisa.unibox.beans.ArticoloLibro;
import it.unisa.unibox.beans.ArticoloRivista;
import it.unisa.unibox.beans.AttiCongresso;
import it.unisa.unibox.beans.Brevetto;
import it.unisa.unibox.beans.Curatela;
import it.unisa.unibox.beans.Monografia;
import it.unisa.unibox.beans.Prodotto;
import it.unisa.unibox.beans.Ricercatore;
import it.unisa.unibox.commons.DBConstants;
import it.unisa.unibox.commons.DBNames;
import it.unisa.unibox.facade.FacadeProdotti;
import it.unisa.unibox.facade.IFacadeProdotti;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class LoginServlet
 */
public class InserisciProdottoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public static ServletContext servletContext;

	private boolean isMultipart;
	private String filePath;
	private int maxFileSize = 1000 * 1024;
	private int maxMemSize = 10 * 1024;
	private File file ;     

	public static IFacadeProdotti facade;


	public InserisciProdottoServlet() {
		super();
	}

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		try {
			super.init(config);			
			servletContext = getServletConfig().getServletContext();
			filePath = servletContext.getRealPath("files");
			facade = new FacadeProdotti();

		} 

		catch (Exception e) {
			e.printStackTrace();
		}
	}


	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		doPost(request,response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		response.setContentType("text/html");
		response.setHeader("Cache-Control",	"no-store, no-cache, must-revalidate");
		PrintWriter out = response.getWriter();
		isMultipart = ServletFileUpload.isMultipartContent(request);
		if(isMultipart){
			if(uploadFile(request))			
				out.write(file.getName());
			else
				out.write("errore");
		}
		else{
			Prodotto prodotto = creaBean(request);
			if(prodotto!=null){
				facade.inserisciProdotto(prodotto);	
				out.write("ok");
				}
			else{
				out.write("no");
			}
		}
	}

	protected Prodotto creaBean(HttpServletRequest request){


		Prodotto p = null;

		
		String titolo = request.getParameter(DBNames.ATT_PRODOTTO_TITOLO);
		String abstract_field = request.getParameter("abstract_field");
		int anno = 	Integer.parseInt(request.getParameter(DBNames.ATT_PRODOTTO_ANNO));
		String lingua = request.getParameter(DBNames.ATT_PRODOTTO_LINGUA);
		String url = request.getParameter(DBNames.ATT_PRODOTTO_URL);
		String note = request.getParameter(DBNames.ATT_PRODOTTO_NOTE);
		
		String tipologia = request.getParameter(DBNames.ATT_PRODOTTO_TIPOLOGIA);
		int stato = request.getParameter(DBNames.ATT_PRODOTTO_STATO)==null ? DBConstants.PRODOTTO_STATO_DRAFT : DBConstants.PRODOTTO_STATO_COMPLETO;
		int pubblico = request.getParameter(DBNames.ATT_PRODOTTO_PUBBLICO).equalsIgnoreCase("si") ? DBConstants.PRODOTTO_DOMINIO_PUBBLICO : DBConstants.PRODOTTO_DOMINIO_PRIVATO;
		System.out.println("->>>> "+request.getParameter(DBNames.ATT_PRODOTTO_ANNO));

		
		if(!controllaCampi(titolo, abstract_field, anno, lingua, url))
			return p;
		
		
		
		if(tipologia.equalsIgnoreCase("Altro")){
	/*		if(!controllaCampiAltro(request.getParameter("descrizione")))
				return p;
			else*/
				p = new AltroProdotto(0,(Ricercatore) request.getSession().getAttribute("ricercatore"),
						"Altro",
						titolo, 
						abstract_field,
						stato,
						pubblico,
						anno,
						lingua,
						url,
						note,
						/*request.getParameter("descrizione")*/""); // In attesa dei campi del client...
		}
		
		else if(tipologia.contains("libro")){
			if(!controllaCampiArticoloLibro(request.getParameter("isbn"),request.getParameter("editore"),
					Integer.parseInt(request.getParameter("da_pagina")), Integer.parseInt(request.getParameter("a_pagina"))))
				return p;
			else
				p = new ArticoloLibro(0,(Ricercatore) request.getSession().getAttribute("ricercatore"),
						"Articolo Libro",
						titolo, 
						abstract_field,
						stato,
						pubblico,
						anno,
						lingua,
						url,
						note,
						request.getParameter("isbn"),
						request.getParameter("editore"),
						Integer.parseInt(request.getParameter("da_pagina")),
						Integer.parseInt(request.getParameter("a_pagina")));
		}
		
		else if(tipologia.contains("rivista")){
			if(!controllaCampiArticoloRivista(request.getParameter("issn"),request.getParameter("nomeRivista"),
					Integer.parseInt(request.getParameter("da_pagina")), Integer.parseInt(request.getParameter("a_pagina"))))
				return p;
			else
				p = new ArticoloRivista(0,(Ricercatore) request.getSession().getAttribute("ricercatore"),
						"Articolo Rivista",
						titolo, 
						abstract_field,
						stato,
						pubblico,
						anno,
						lingua,
						url,
						note,
						request.getParameter("issn"),
						request.getParameter("nome_rivista"),
						Integer.parseInt(request.getParameter("da_pagina")),
						Integer.parseInt(request.getParameter("a_pagina")));
		}
		
		else if(tipologia.contains("congresso")){
			if(!controllaCampiCongresso(request.getParameter("luogo"),request.getParameter("conferenza"),
					request.getParameter("data")))
				return p;
			else		
				p = new AttiCongresso(0,(Ricercatore) request.getSession().getAttribute("ricercatore"),
						"Atti Congresso",
						titolo, 
						abstract_field,
						stato,
						pubblico,
						anno,
						lingua,
						url,
						note,
						request.getParameter("luogo"),
						request.getParameter("conferenza"),
						request.getParameter("data"));
		}
		
		else if(tipologia.equalsIgnoreCase("Brevetto")){
			if(!controllaCampiBrevetto(request.getParameter("durata"),
					request.getParameter("estensione")))
				return p;
			else		
				p = new Brevetto(0,(Ricercatore) request.getSession().getAttribute("ricercatore"),
						"Brevetto",
						titolo, 
						abstract_field,
						stato,
						pubblico,
						anno,
						lingua,
						url,
						note,
						Integer.parseInt(request.getParameter("durata")),
						request.getParameter("estensione"));
		}
		
		else if(tipologia.equalsIgnoreCase("Curatela")){
			if(!controllaCampiCuratela(request.getParameter("testo")))
				return p;
			else		
				p = new Curatela(0,(Ricercatore) request.getSession().getAttribute("ricercatore"),
						"Curatela",
						titolo, 
						abstract_field,
						stato,
						pubblico,
						anno,
						lingua,
						url,
						note,
						request.getParameter("testo"));
		}
		
		else if(tipologia.equalsIgnoreCase("Monografia")){
			if(!controllaCampiMonografia(request.getParameter("volume"), request.getParameter("argomento")))
				return p;
			else		
				p = new Monografia(0,(Ricercatore) request.getSession().getAttribute("ricercatore"),
						"Monografia",
						titolo, 
						abstract_field,
						stato,
						pubblico,
						anno,
						lingua,
						url,
						note,
						Integer.parseInt(request.getParameter("volume")),
						request.getParameter("argomento"));
		}
		return p;
	}

	protected boolean uploadFile(HttpServletRequest request){

		isMultipart = ServletFileUpload.isMultipartContent(request);
		if(!isMultipart)
			return false;

		DiskFileItemFactory factory = new DiskFileItemFactory();
		factory.setSizeThreshold(maxMemSize);
		factory.setRepository(new File(filePath));

		ServletFileUpload upload = new ServletFileUpload(factory);
		upload.setSizeMax(maxFileSize);

		try{ 

			List<?> fileItems = upload.parseRequest(request);
			Iterator<?> i = fileItems.iterator();
			while ( i.hasNext () ) 
			{
				FileItem fi = (FileItem)i.next();
				if ( !fi.isFormField () )	
				{
					String fileName = fi.getName();
					if( fileName.lastIndexOf("\\") >= 0 )
						file = new File( filePath + File.separator + fileName.substring(fileName.lastIndexOf("\\"))) ;
					else
						file = new File( filePath + File.separator + fileName.substring(fileName.lastIndexOf("\\")+1)) ;
					System.out.println(file.getAbsolutePath());
					fi.write(file) ;
					return true;
				}
			}
			return false;
		}catch(Exception ex) {
			ex.printStackTrace();
			return false;
		}
	}
	
	
	
	private static boolean controllaCampi(String titolo, String abstract_field, int anno, String lingua, String url){
		if(titolo.length() < 2 || titolo.length() > 120 || titolo.equals("")
				|| abstract_field.length() < 2 || abstract_field.length() > 1000 || abstract_field.equals("")
				|| lingua.length() < 6 || lingua.length() > 20 || lingua.equals("")
				|| url.length() < 2 || url.length() > 60 || url.equals(""))
			return false;
		
		return true;
	}
	
	private static boolean controllaCampiAltro(String descrizione){
		if(descrizione.length() < 1 || descrizione.length() > 120 || descrizione.equals(""))
			return false;
		
		return true;
	}
	
	private static boolean controllaCampiArticoloLibro(String ISBN, String editore, int daPagina, int aPagina){
		if(ISBN.length() != 13 || ISBN.equals("") //TODO ISBN deve essere 13 o contare anche trattini?
			 || editore.length() < 6 || editore.length() > 20
			 || daPagina < 0 || daPagina > 9999
			 || aPagina < 0 || aPagina > 9999 )
			return false;
		
		return true;
	}
	
	private static boolean controllaCampiArticoloRivista(String ISSN, String nomeRivista, int daPagina, int aPagina){
		if(ISSN.length() != 8 || ISSN.equals("") //TODO ISSN deve essere 8 o contare anche trattini?
			 || nomeRivista.length() < 6 || nomeRivista.length() > 20
			 || daPagina < 0 || daPagina > 9999
			 || aPagina < 0 || aPagina > 9999 )
			return false;
		
		return true;
	}
	
	private static boolean controllaCampiCongresso(String luogo, String conferenza, String data){
		if(luogo.length() < 6 || luogo.length() >20 /*|| luogo.equals("")*/
			 || conferenza.length() < 6 || conferenza.length() > 20
	//TODO come controllare formato data 		 || data 
			 )
			return false;
		
		return true;
	}
	
	private static boolean controllaCampiBrevetto(String durata, String estensione){
		if(Integer.parseInt(durata) < 0 || Integer.parseInt(durata) > 9999 || durata.equals("")
			 || estensione.length() < 1 || estensione.length() > 20 || estensione.equals("") )
			return false;
		
		return true;
	}
	
	private static boolean controllaCampiCuratela(String testo){
		if(testo.length() < 1 || testo.length() > 120 || testo.equals("") )
			return false;
		
		return true;
	}
	
	private static boolean controllaCampiMonografia(String volume, String argomento){
		if(Integer.parseInt(volume) < 0 || Integer.parseInt(volume) >= 999 //TODO
			 || argomento.length() < 6 || argomento.length() > 20 || argomento.equals("") )
			return false;
		
		return true;
	}
}
